package com.sky.service.courier.impl;

import com.sky.dto.CourierTradeQueryDto;
import com.sky.dto.PickUpDTO;
import com.sky.exception.BaseException;
import com.sky.mapper.admin.OrderMapper;
import com.sky.mapper.courier.CourierMapper;
import com.sky.mapper.courier.CourierTradeOrderMapper;
import com.sky.pojo.Courier;
import com.sky.pojo.CourierTradeOrder;
import com.sky.pojo.Orders;
import com.sky.service.courier.CourierTradeOrderService;
import com.sky.utils.MapUtils;
import com.sky.vo.CourierTradeOrderVO;
import com.sky.vo.OrderDetailVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class CourierTradeOrderServiceImpl implements CourierTradeOrderService {

    @Autowired
    private CourierTradeOrderMapper courierTradeOrderMapper;
    @Autowired
    private CourierMapper courierMapper;
    @Autowired
    private OrderMapper orderMapper;


    @Override
    public List<CourierTradeOrderVO> queryCourierTradeOrderByCourierIdAndStatus(Integer status, Integer courierId) {
        List<CourierTradeOrderVO> voList = new ArrayList<>();
        //去运单表里面查询当前骑手对应状态的运单信息
        List<CourierTradeOrder> tradeOrders = courierTradeOrderMapper.findByCourierAndStatus(status,courierId);
        if(CollectionUtils.isEmpty(tradeOrders)){
            return voList;
        }
        Courier courier = courierMapper.findById(courierId);
        //封装剩下的数据：骑手和商家的距离，商家和客户的距离 到达时间等
        for (CourierTradeOrder tradeOrder : tradeOrders) {
            CourierTradeOrderVO orderVo = new CourierTradeOrderVO();
            BeanUtils.copyProperties(tradeOrder,orderVo);
            //商家的地址转经纬度
            String shopLngLat = MapUtils.addressToLnglat(tradeOrder.getShopAddress());
            //计算骑手和商家的距离
            double distance = MapUtils.calculateDistance(shopLngLat, courier.getCurLocation());
            orderVo.setShopAndCourierDistance(distance);
            //计算用户和商家的距离
            String userLngLst = MapUtils.addressToLnglat(tradeOrder.getCustomerAddress());
            double userShopDistance = MapUtils.calculateDistance(shopLngLat, userLngLst);
            orderVo.setShopAndCustomerDistance(userShopDistance);
            //预期送达时间，当前时间和客户预期时间差
            long seconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), tradeOrder.getCustomerExpectedDeliveryTime());
            orderVo.setCurrentTimeAndCustomerExpectedTime(seconds);
            voList.add(orderVo);
        }

        //排序
        voList.stream().sorted(Comparator.comparing(CourierTradeOrderVO::getShopAndCourierDistance)).collect(Collectors.toList());
        //设置序号
        int index = 1;
        for (CourierTradeOrderVO orderVO : voList) {
            orderVO.setMarkSort(index ++);
        }
        return voList;
    }

    @Override
    public CourierTradeOrder queryTradeOrderByOrderNum(String tradeNo) {
        return courierMapper.findByOrderNumber(tradeNo);
    }

    @Override
    public List<OrderDetailVO> confirmPickUpList(Long tradeNo) {
        return courierTradeOrderMapper.confirmPickUpList(tradeNo);
    }

    @Override
    public void confirmPickUp(PickUpDTO dto) {
        CourierTradeOrder courierTradeOrder = courierTradeOrderMapper.findTradeOrderByTradeNo(dto.getTradeNo());
        if (courierTradeOrder == null){
            throw new BaseException("查无此单");
        }
        Orders orders = new Orders();
        //将运单状态改为待送达
        if (dto.getStatus()==3) {
            courierTradeOrderMapper.updateStatusByTradeNo(dto.getTradeNo(),CourierTradeOrder.CONFIRM_TRADE);
            //将订单状态改为待送达
            orders.setStatus(Orders.TOBEPICKEDUP);
            orders.setNumber(courierTradeOrder.getOrderNumber());
            orderMapper.updateOrder(orders);
        } else if(dto.getStatus()==4) {
            courierTradeOrderMapper.updateCompleteStatusByTradeNo(dto.getTradeNo(),CourierTradeOrder.TRADE_COMPLETE,LocalDateTime.now());
            //将订单状态改为待送达
            orders.setStatus(Orders.CANCELLED_ORDER);
            orders.setNumber(courierTradeOrder.getOrderNumber());
            orders.setDeliveryTime(LocalDateTime.now());
            orderMapper.updateOrder(orders);
        }
    }

    @Override
    public List<CourierTradeOrderVO> queryWaybillsByDate(CourierTradeQueryDto dto) {

        //查询骑手当天的订单数据 （已送达和已取消）
        List<CourierTradeOrder> courierTradeOrders =  courierTradeOrderMapper.selectCourierOrders(dto.getDate(),dto.getStatus(),dto.getCourierId());

        List<CourierTradeOrderVO> voList = new ArrayList<>();

        courierTradeOrders.forEach(tradeOrder -> {
            CourierTradeOrderVO vo = new CourierTradeOrderVO();
            BeanUtils.copyProperties(tradeOrder,vo);
            //计算商家和骑手的距离
            vo.setShopAndCourierDistance(233.00);
            //计算商家和客户的距离
            vo.setShopAndCustomerDistance(400.00);
            //计算时间差
            vo.setCurrentTimeAndCustomerExpectedTime(6555l);
            vo.setMarkSort(1);
            voList.add(vo);
        });
        return voList;
    }
}
